package com.hb.config;

import com.hb.service.SpitterService;
import com.hb.service.impl.SpitterServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.remoting.rmi.RmiProxyFactoryBean;
import org.springframework.remoting.rmi.RmiServiceExporter;

@Configuration
public class RMIConfig {
    /**
     * 使用 RmiServiceExporter 将 SpitterServiceImpl 发布为 RMI 服务的最简单方式是在 Spring 中使用如下的 @Bean 方法进行配置。
     * @return
     */
    @Bean
    public RmiServiceExporter rmiServiceExporter() {
        RmiServiceExporter rmiServiceExporter = new RmiServiceExporter();
        // 这里会把 spitterService bean 设置到 service 属性中，表明 RmiServiceExporter 要把该 bean 发布为一个 RMI 服务。
        rmiServiceExporter.setService(new SpitterServiceImpl());
        // serviceName 属性命名了 RMI 服务
        rmiServiceExporter.setServiceName("SpitterService");
        // serviceInterface 属性指定了此服务所实现的接口
        rmiServiceExporter.setServiceInterface(SpitterService.class);
        // 默认情况下，RmiServiceExporter 会尝试绑定到本地机器 1099 端口上的 RMI 注册表。如果在这个端口没有发现 RMI 注册表，RmiServiceExporter
        // 将会启动一个注册表。如果希望绑定到不同端口或主机上的 RMI 注册表，那么我们可以通过 registryPort 和 registryHost 属性来指定。
        // 例如，下面的 RmiServiceExporter 会尝试绑定 rmi.spitter.com 主机 1199 端口上的 RMI 注册表。
        rmiServiceExporter.setRegistryHost("rmi.spitter.com");
        rmiServiceExporter.setRegistryPort(1199);
        return rmiServiceExporter;
    }

    /**
     * 使用 RmiProxyFactoryBean 引用 SpitterService 的 RMI 服务是非常简单的，只需要在客户端的 Spring 配置中增加如下的 @Bean 方法
     * @return
     */
    @Bean
    public RmiProxyFactoryBean spitterServiceProxy() {
        RmiProxyFactoryBean rmiProxy = new RmiProxyFactoryBean();
        // 服务的 URL 是通过 RmiProxyFactoryBean 的 serviceUrl 属性来设置的，在这里，服务名被设置为 SpitterService，并且声明服务是在本地机器上的
        rmiProxy.setServiceUrl("rmi://localhost/SpitterService");
        // 服务提供的接口由 serviceInterface 属性来指定
        rmiProxy.setServiceInterface(SpitterService.class);
        return rmiProxy;
    }
}
